//###########################################################################
//
// FILE:   DSP281x_SysCtrl.c
//
// TITLE:  DSP281x Device System Control Initialization & Support Functions.
//
// DESCRIPTION:
//
//         Example initialization of system resources.
//
//###########################################################################
//
//  Ver | dd mmm yyyy | Who  | Description of changes
// =====|=============|======|===============================================
//  1.00| 11 Sep 2003 | L.H. | Changes since previous version (v.58 Alpha)
//      |             |      | Additional comments added to explain the PLL
//      |             |      |    initialization.
//      |             |      | Changed the PLL initialization to take into
//      |             |      |    account bit definitions for the PLLCR register
//      |             |      | Removed DFT initialization - no longer needed 
//      |             |      |    as of Rev C F2810/12 silicon
//      |             |      | Split some operations into their own function
//      |             |      |    for better modularity
//      |             |      | Added pipeline flush after the Flash Init
//###########################################################################


#include "DSP281x_Device.h"     // DSP281x Headerfile Include File


//---------------------------------------------------------------------------
// InitSysCtrl: 
//---------------------------------------------------------------------------
// This function initializes the System Control registers to a known state.
// - Disables the watchdog
// - Set the PLLCR for proper SYSCLKOUT frequency 
// - Set the pre-scaler for the high and low frequency peripheral clocks
// - Enable the clocks to the peripherals

#pragma CODE_SECTION(InitSysCtrl, "FuncsMap2H0SARam")
void InitSysCtrl(void)
{
   // Disable the watchdog        
   DisableDog();
   
   // Initialize the PLLCR to 0xA
   InitPll(PLLCR_VAL);

   // Initialize the peripheral clocks
   InitPeripheralClocks();
}


//---------------------------------------------------------------------------
// Example: InitFlash: 
//---------------------------------------------------------------------------
// This function initializes the Flash Control registers

//                   CAUTION 
// This function MUST be executed out of RAM. Executing it
// out of OTP/Flash will yield unpredictable results

void InitFlash(void)
{
   EALLOW;
   //Enable Flash Pipeline mode to improve performance
   //of code executed from Flash.
   FlashRegs.FOPT.bit.ENPIPE = 1;
   
   FlashRegs.FPWR.bit.PWR = 3; // Flash set to active mode
   //                CAUTION
   //Minimum waitstates required for the flash operating
   //at a given CPU rate must be characterized by TI. 
   //Refer to the datasheet for the latest information.  

   //Set the Random Waitstate for the Flash
   FlashRegs.FBANKWAIT.bit.RANDWAIT = 5;
   
   //Set the Paged Waitstate for the Flash
   FlashRegs.FBANKWAIT.bit.PAGEWAIT = 5;
   
   //                CAUTION
   //Minimum cycles required to move between power states
   //at a given CPU rate must be characterized by TI. 
   //Refer to the datasheet for the latest information.
     
   //For now use the default count
   //Set number of cycles to transition from sleep to standby
   FlashRegs.FSTDBYWAIT.bit.STDBYWAIT = 0x01FF;       
   
   //Set number of cycles to transition from standby to active
   FlashRegs.FACTIVEWAIT.bit.ACTIVEWAIT = 0x01FF;   
   EDIS;

   //Force a pipeline flush to ensure that the write to 
   //the last register configured occurs before returning.  

   asm(" RPT #7 || NOP");
}	


//---------------------------------------------------------------------------
// Example: KickDog: 
//---------------------------------------------------------------------------
// This function resets the watchdog timer.
// Enable this function for using KickDog in the application 

void KickDog(void)
{
    EALLOW;
    SysCtrlRegs.WDKEY = 0x0055;
    SysCtrlRegs.WDKEY = 0x00AA;
    EDIS;
}

//---------------------------------------------------------------------------
// Example: DisableDog: 
//---------------------------------------------------------------------------
// This function disables the watchdog timer.

void DisableDog(void)
{
    EALLOW;
    SysCtrlRegs.WDCR = 0x0068;
    EDIS;
}

void EnableDog(void)
{
  EALLOW;
  SysCtrlRegs.WDCR = 0x00AF;
  EDIS;
}

//---------------------------------------------------------------------------
// Example: InitPll: 
//---------------------------------------------------------------------------
// This function initializes the PLLCR register.

void InitPll(Uint16 val)
{
   volatile Uint16 iVol;   
   
   if (SysCtrlRegs.PLLCR.bit.DIV != val)
   {
      EALLOW;
      SysCtrlRegs.PLLCR.bit.DIV = val;
      EDIS;
   
      DisableDog();
   
      for(iVol= 0; iVol< ( (131072/2)/12 ); iVol++)
      {
         asm(" NOP");
      }
   }
}

void InitPeripheralClocks(void)
{
   /////////////////////////////////////////////////////////////////
   //     GPS:
   //               SPI   Not Used
   //               McBSP not used
   //               EVA   Used GP Timer 1 & 2
   //               EVB   not used
   //               SCIA  Used, 9600bps
   //               SCIB  Used, 9600bps
   //               ADC   Not Used
   /////////////////////////////////////////////////////////////////
  EALLOW;
  SysCtrlRegs.HISPCP.all = HISPCP_VAL;
  SysCtrlRegs.LOSPCP.all = LOSPCP_VAL;   	
// Peripheral clock enables set for the selected peripherals. 
  SysCtrlRegs.PCLKCR.bit.EVAENCLK = 1;
  SysCtrlRegs.PCLKCR.bit.EVBENCLK = 0;
  SysCtrlRegs.PCLKCR.bit.SCIAENCLK = 1;
  SysCtrlRegs.PCLKCR.bit.SCIBENCLK = 1;
  SysCtrlRegs.PCLKCR.bit.MCBSPENCLK = 0;

  SysCtrlRegs.PCLKCR.bit.SPIENCLK = 0;

  SysCtrlRegs.PCLKCR.bit.ECANENCLK = 0;
  SysCtrlRegs.PCLKCR.bit.ADCENCLK = 0;
  EDIS;
}

	
//===========================================================================
// No more.
//===========================================================================
